#ifndef ENEMY_OWNED_STATES_H
#define ENEMY_OWNED_STATES_H
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#include "State.h"

// forward declaration
class Enemy;

// Idle State Behavior 
class IdleState : public State<Enemy>
{
private:

  IdleState(){}

  //copy ctor and assignment should be private
  IdleState(const IdleState&);
  IdleState& operator=(const IdleState&);

public:

  //this is a singleton
  static IdleState* Instance();
  
  virtual void Enter(Enemy *m_enemy);

  virtual void Execute(Enemy *m_enemy);

  virtual void Exit(Enemy *m_enemy);
};

// Patrol state behavior
class PtrlState : public State<Enemy>
{
private:

  PtrlState(){}

  //copy ctor and assignment should be private
  PtrlState(const PtrlState&);
  PtrlState& operator=(const PtrlState&);

public:

  //this is a singleton
  static PtrlState* Instance();
  
  virtual void Enter(Enemy *m_enemy);

  virtual void Execute(Enemy *m_enemy);

  virtual void Exit(Enemy *m_enemy);
};

// attack state behavior
class AtkState : public State<Enemy>
{
private:

  AtkState(){}

  //copy ctor and assignment should be private
  AtkState(const AtkState&);
  AtkState& operator=(const AtkState&);

public:

  //this is a singleton
  static AtkState* Instance();
  
  virtual void Enter(Enemy *m_enemy);

  virtual void Execute(Enemy *m_enemy);

  virtual void Exit(Enemy *m_enemy);
};

// Death state behavior
class DthState : public State<Enemy>
{
private:

  DthState(){}

  //copy ctor and assignment should be private
  DthState(const DthState&);
  DthState& operator=(const DthState&);

public:

  //this is a singleton
  static DthState* Instance();
  
  virtual void Enter(Enemy *m_enemy);

  virtual void Execute(Enemy *m_enemy);

  virtual void Exit(Enemy *m_enemy);
};

// Flee state behavior
class FleeState : public State<Enemy>
{
private:

  FleeState(){}

  //copy ctor and assignment should be private
  FleeState(const FleeState&);
  FleeState& operator=(const FleeState&);

  float m_x, m_y, m_z;

public:

  //this is a singleton
  static FleeState* Instance();
  
  virtual void Enter(Enemy *m_enemy);

  virtual void Execute(Enemy *m_enemy);

  virtual void Exit(Enemy *m_enemy);
};

#endif